package com.wiznbiz.util;

/**
 * Byte 관련 Utility 클래스
 * 
 * @author Administrator
 *
 */
public class ByteUtil {

	private static StringBuffer strBuffer;
	/**
	 * 주어진 integer값을 byte 배열로 변환 하는 메소드
	 * 
	 * @param integer
	 * @return
	 */
	public static byte[] int2byte(int integer){
		byte[] b = new byte[4];
		b[0]=(byte) (integer & 0xff);
		b[1]=(byte) ((integer >> 8) & 0xff);
		b[2]=(byte) ((integer >> 16) & 0xff);
		b[3]=(byte) ((integer >> 24) & 0xff);		
		return b;
	}

	
	/**
	 * 주어진 byte[]를 Hex String 으로 변환 리턴 하는 메소드 
	 * 
	 * @param ba 										byte배열
	 * @param isDisplayEachByteSpace		1byte 사이에 space 여부
	 * @param len 										주어진 byte 배열에서 변환할 크기
	 * @return Hex 스트링
	 */
	public static String byteArrayToHex(byte[] ba, boolean isDisplayEachByteSpace, int len){
		
		if(ba == null || ba.length == 0){
			return null;
		}
		if(strBuffer == null){
			strBuffer = new StringBuffer();
		}else{
			strBuffer.setLength(0);
		}
		String hexNumber;
		
		int idx = 1;
		for(int x = 0; x < len; x++){
			//hexNumber = "0" + Integer.toHexString(0xff & ba[x]);
			hexNumber = "0" + Integer.toHexString(0xFF & ba[x]);
			strBuffer.append(hexNumber.substring(hexNumber.length()-2));
			
			if(isDisplayEachByteSpace) strBuffer.append(" ");
			
			if(idx%40 == 0){
				strBuffer.append("\n");
			}			
			
			idx++;
		}
		return strBuffer.toString().toUpperCase();
		
		//return "";
	}	
	
	/**
	 * 주어진어진 byte[]를 Hex String 으로 변환 리턴 하는 메소드 
	 * 
	 * @param ba byte배열
	 * @return
	 */
	public static String byteArrayToHex(byte[] ba){
		if(ba == null) return null;
		return byteArrayToHex(ba, true, ba.length);
	}

	public static String byteArrayToHex(byte[] ba, int len){
		if(ba == null) return null;
		return byteArrayToHex(ba, true, len);
	}

	public static String byteArrayToHex(byte ba){
		byte[] tmp = new byte[1];
		tmp[0] = ba;
		return byteArrayToHex(tmp, true, tmp.length);
	}
	
	/**
	 * 주어진 Hex String값을 byte로 변환 하는 메소드
	 * 
	 * @param hex
	 * @return
	 */
	public static byte[] hexToByteArray(String hex) { 
		if (hex == null || hex.length() == 0) return null; 
		
		byte[] ba = new byte[hex.length() / 2]; 
		for (int i = 0; i < ba.length; i++) { 
			ba[i] = (byte) Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16); 
		}
		return ba; 
	} 	
	
	
	/**
	 * 주어진 byte 배열을 binary String으로 변환 메소드<br><br>
	 * 
	 * @param bytes
	 * @param reverseFlag true일때 Binary 문자열을 뒤집어서 리턴
	 * @return
	 */
	public static String toBinaryString(byte[] bytes, boolean reverseFlag){
		String binaryString = "";
		for(int i=0; i< bytes.length; i++){
			binaryString += String.format("%8s", Integer.toBinaryString(bytes[i] & 0xFF)).replace(' ', '0');
		}
		if(reverseFlag){
			binaryString = Util.reverseString(binaryString);
		}
		return binaryString;
	}
	
	
	/**
	 * 주어진 byte 를 binary String으로 변환 메소드<br><br>
	 * 
	 * @param b
	 * @param reverseFlag true일때 Binary 문자열을 뒤집어서 리턴
	 * @return
	 */
	public static String toBinaryString(byte b, boolean reverseFlag){
		byte[] ba = new byte[1];
		ba[0] = b;
		return toBinaryString(ba, reverseFlag);
	}
	
	/**
	 * 주어진 byte를 int 값으로 변환 메소드
	 * 
	 * @param b
	 * @return
	 */
	public static int toInt(byte b){
		return b & 0xFF;
	}	
	
	/**
	 * 주어진 binary 형태의 String을 byte[] 로 변환 하는 메소드<br><br>
	 * 
	 * @param input				binary 문자열
	 * @param reverseFlag	true일때 Binary 문자열을 뒤집어서 byte 생성
	 * @return
	 */
	public static byte[] toByteArray(String input, boolean reverseFlag){
		if(reverseFlag){
			input = Util.reverseString(input);
		}
		
		int inputLen = input.length();
		int len = (inputLen%8 == 0) ? inputLen/8 : inputLen/8+1;
		
		byte[] ba = new byte[len];
		int iv = Integer.parseInt(input, 2);
		
		int tmp = 0;
		for(int i=0; i< ba.length; i++){
			
			tmp = (iv >> i*8);
			ba[len-i-1] = (byte) tmp;
		}
		return ba;
	} 	
	
	
}
